home *** CD-ROM | disk | FTP | other *** search
/ Ultimedia 2 / Ultimedia 2.iso / tools / animplayer / amipeg / source.lha / sutils.s < prev    next >
Encoding:
Text File  |  1994-03-03  |  17.9 KB  |  848 lines

  1. ;
  2. ; Some practical assembler utility routines. See sutils.h for corresponding C prototypes
  3. ; They correspond to functions defined in util.c
  4. ;
  5. ; Michael Rausch  16-2-94  1:05:00
  6. ;
  7.  
  8.     SECTION    text,CODE
  9.  
  10. ER    EQU    -1
  11.  
  12. END_OF_BLOCK EQU 62
  13. ESCAPE    EQU    61
  14.  
  15. RUN_MASK EQU    $fc00
  16. RUN_SHIFT EQU    10
  17.  
  18. LEVEL_MASK EQU    $03f0
  19. LEVEL_SHIFT EQU    4
  20.  
  21. NUM_MASK EQU    $000f
  22.  
  23.  
  24.     XREF    @correct_underflow
  25.     XREF    _bitBuffer
  26.     XREF    _bufLength
  27.     XREF    _bitBuffer
  28.     XREF    _bitOffset
  29. ;    XREF    _bitCount    ; ANALYSIS
  30. ;    XREF    _mbCoeffPtr    ; ANALYSIS
  31.  
  32.     XREF    _dct_coeff_first
  33.     XREF    _dct_coeff_next
  34.     XREF    _dct_coeff_tbl_0
  35.     XREF    _dct_coeff_tbl_1
  36.     XREF    _dct_coeff_tbl_2
  37.     XREF    _dct_coeff_tbl_3
  38.  
  39.     XREF    _zigzag_direct
  40.  
  41.     XDEF    _dummy_public
  42. _dummy_public:
  43.     nop
  44.  
  45.  
  46. ; ***************************************************************
  47.  
  48. ; Fills in the data if a new quantization matrix is encountered in the stream.
  49. ; In addition, it creates the qscale multiplication tables.
  50.  
  51.     XDEF    @new_matrix
  52. @new_matrix:
  53.     movem.l    d2-d4/a2-a3,-(sp)
  54.     move.l    a0,a2
  55.  
  56.     moveq    #16,d1
  57.     cmp.l    _bufLength(a4),d1
  58.     ble.s    nm_nc
  59.     bsr    @correct_underflow
  60. nm_nc:
  61.  
  62.     move.l    a2,a1
  63.  
  64.     move.l    _bitOffset(a4),d1
  65.     move.l    _bitBuffer(a4),a0
  66.  
  67.     moveq    #8,d3
  68.     moveq    #32,d2
  69.  
  70.     moveq    #63,d4
  71. get64bytesfromstream:
  72.  
  73.     bfextu    (a0){d1:d3},d0
  74.     move.w    d0,(a1)+        ; was indexed via zigzag_direct, but changed in utilisation as well
  75.  
  76.     add.l    d3,d1
  77.     cmp.l    d2,d1
  78.     blt.s    nmxw
  79.     sub.l    d2,d1
  80.     addq.l    #4,a0
  81.     subq.l    #1,_bufLength(a4)
  82. nmxw:
  83.     dbra    d4,get64bytesfromstream
  84.  
  85. ;    add.l    #64*8,_bitCount(a4)    ; ANALYSIS
  86.     move.l    a0,_bitBuffer(a4)
  87.     move.l    d1,_bitOffset(a4)
  88.  
  89.  
  90.     move.l    a2,a3            ; last scale
  91.     moveq    #29,d0
  92. allqscales:
  93.     move.l    a2,a0            ; first scale
  94.     moveq    #15,d1
  95. qscaletab:
  96.     rept 2
  97.     move.l    (a0)+,d2        ; get first qscale
  98.     add.l    (a3)+,d2        ; add last qscale
  99.     move.l    d2,(a1)+        ; is new qscale    
  100.     endr
  101.     dbra    d1,qscaletab
  102.     dbra    d0,allqscales
  103.  
  104.  
  105.     movem.l    (sp)+,d2-d4/a2-a3
  106.     rts
  107.  
  108.  
  109. ; ***************************************************************
  110.  
  111. process_intra MACRO (label, sparereg)
  112.  
  113.     bfextu    (a1){d7:d6},d0
  114.  
  115.     move.l    d0,d1
  116.     rol.l    #8,d1            ; only .b-tests are valid!
  117.  
  118.     cmp.b    #3,d1
  119.     bls    .adcd_others
  120.  
  121.     and.w    #$ff,d1
  122.     moveq    #0,d5
  123.     move.w    (a2,d1.w*2),d5        ; value
  124.  
  125.     move.l    d5,d3
  126.     lsr.w    #RUN_SHIFT-8,d3        ; run
  127.     lsr.w    #8,d3
  128.     cmp.w    #END_OF_BLOCK,d3
  129.     beq    \1            ; reci_ready
  130.     cmp.w    #ESCAPE,d3
  131.     beq.s    .aescape
  132.  
  133. .astd_handle:
  134.  
  135.     move.w    d5,d4            ; flushed
  136.     and.w    #NUM_MASK,d4
  137.     addq.w    #2,d4
  138.  
  139.     and.w    #LEVEL_MASK,d5
  140.     lsr.w    #LEVEL_SHIFT,d5        ; level
  141.  
  142.     moveq.l    #32,d1
  143.     sub.w    d4,d1
  144.     btst    d1,d0
  145.     beq    .aoutblockescape
  146.     neg.l    d5
  147.     bra    .aoutblockescape        ; fertig
  148. .aescape:
  149.  
  150.     move.w    d5,d4            ; flushed
  151.     and.w    #NUM_MASK,d4
  152.     add.w    #1+22,d4
  153.  
  154.     moveq    #18+22-8,d1
  155.     sub.w    d4,d1
  156.     move.l    d0,d3
  157.     lsr.l    d1,d3            ; temp
  158.  
  159.     move.w    d3,d5            ; ?!??
  160.     lsr.l    #8,d3
  161.  
  162.     and.w    #$3fff,d3        ; run/level
  163.  
  164.     tst.b    d3
  165.     beq.s    .aoutblockescape3
  166.  
  167.     cmp.b    #128,d3
  168.     beq.s    .ais128
  169.     move.b    d3,d5
  170.     subq.w    #8,d4
  171.     bra.s    .aoutblockescape3
  172.  
  173. .ais128:
  174.     sub.w    #256,d5
  175.     ext.l    d5
  176.     bra.s    .aoutblockescape2
  177.  
  178.  
  179. .adcd_others:
  180.     beq.s    .adc3            ; cmp #3 from above
  181.     tst.b    d1
  182.     bne.s    .adc1
  183.     moveq    #16,d1
  184.     move.l    #255,d3
  185.     lea    _dct_coeff_tbl_0(a4),\2
  186.     bra.s    .adcdo_gotval
  187. .adc1:    subq.b    #1,d1
  188.     bne.s    .adc2
  189.     moveq    #20,d1
  190.     moveq    #15,d3
  191.     lea    _dct_coeff_tbl_1(a4),\2
  192.     bra.s    .adcdo_gotval
  193. .adc2:    lea    _dct_coeff_tbl_2(a4),\2
  194.     bra.s    .adc32
  195. .adc3:    lea    _dct_coeff_tbl_3(a4),\2
  196. .adc32:    moveq    #22,d1
  197.     moveq    #3,d3
  198.  
  199. .adcdo_gotval:
  200.     move.l    d0,d5
  201.     lsr.l    d1,d5
  202.     and.l    d3,d5
  203.     move.w    (\2,d5.w*2),d5    ; value
  204.  
  205.     move.l    d5,d3
  206.     lsr.w    #RUN_SHIFT-8,d3    ; run
  207.     lsr.w    #8,d3
  208.  
  209.     bra    .astd_handle
  210.  
  211.  
  212. .aoutblockescape3:
  213.     extb.l    d5
  214. .aoutblockescape2:
  215.     lsr.w    #8,d3
  216. .aoutblockescape:
  217.  
  218. ;    ext.l    d4
  219. ;    add.l    d4,_bitCount(a4)    ; ANALYSIS
  220.     add.w    d4,d7
  221.     cmp.l    d6,d7
  222.     blt.s    .adcds    ;endofblock
  223.     sub.l    d6,d7
  224.     addq.l    #4,a1
  225.     subq.l    #1,_bufLength(a4)
  226. .adcds:            ;endofblock:
  227.     endm
  228.  
  229. ; *******************
  230.  
  231.  
  232.     XDEF    _recon_nonintra
  233. _recon_nonintra:
  234. rni_regs REG    d2-d7/a2-a3/a5-a6
  235.     movem.l    rni_regs,-(sp)
  236.  
  237.     swap    d0
  238.     move.l    d0,-(sp)            ; qscale
  239.     move.l    a1,a6
  240.  
  241.     lea    _zigzag_direct(a4),a3
  242.     lsl.l    #2,d1                ; i, index to zigzag
  243.     add.l    d1,a3
  244.  
  245.     lea    _dct_coeff_next(a4),a2
  246.  
  247.     move.l    _bitBuffer(a4),a1
  248.     move.l    _bitOffset(a4),d7
  249.     moveq    #32,d6
  250.  
  251. rneci_loop1:
  252.     process_intra    rneci_ready,a0
  253.  
  254.     addq.l    #1,d3
  255.     add.l    d3,d3
  256.     add.l    d3,d3
  257.     add.l    d3,a3                ; i+= run+1  (implicit zigzag)
  258.     move.l    (a3),d1                ; pos
  259.     muls.w    (sp),d5                ; qscale
  260.     asr.w    #3,d5
  261.     move.w    d5,(a6,d1.l*2)
  262.     bra    rneci_loop1
  263.  
  264. rneci_ready:
  265.     move.l    a1,_bitBuffer(a4)
  266.     move.l     d7,_bitOffset(a4)
  267.  
  268.  
  269.  
  270. ; this won't work anymore ... take a3 instead!
  271. ;     addq.l    #1,([_mbCoeffPtr,a4],d1.l*4)    ; ANALYSIS
  272.  
  273.     addq.l    #4,sp
  274.     movem.l    (sp)+,rni_regs
  275.     rts
  276.  
  277.  
  278.  
  279.  
  280. ; ***********************
  281.  
  282.     XDEF    @recon_non2intra
  283. @recon_non2intra:
  284. ri_regs REG    d2-d7/a2-a3/a5-a6
  285.     movem.l    ri_regs,-(sp)
  286.     move.l    a0,a5
  287.  
  288.     lea    _zigzag_direct(a4),a3
  289.     add.l    d0,d0
  290.     add.l    d0,a5
  291.     add.l    d0,d0
  292.     add.l    d0,a3                ; i+= run
  293.  
  294.     bra    r2ni_entry
  295.  
  296.     XDEF    @recon_intra
  297. @recon_intra:
  298.     movem.l    ri_regs,-(sp)
  299.     move.l    a0,a5
  300.  
  301.     lea    _zigzag_direct(a4),a3
  302.  
  303. r2ni_entry:
  304.     move.l    a1,a6
  305.     lea    _dct_coeff_next(a4),a2
  306.  
  307.     move.l    _bitBuffer(a4),a1
  308.     move.l    _bitOffset(a4),d7
  309.     moveq    #32,d6
  310.  
  311. reci_loop1:
  312.     process_intra    reci_ready,a0
  313.  
  314.     addq.l    #1,d3
  315.     add.l    d3,d3
  316.     add.l    d3,a5
  317.     add.l    d3,d3
  318.     add.l    d3,a3                ; i+= run+1  (implicit zigzag)
  319.     move.l    (a3),d1                ; pos
  320.     muls.w    (a5),d5
  321.     asr.w    #3,d5
  322. ; das vorzeichen von (a5) wird benutzt, um d5 mittels lsb auf/abrunden
  323. ; ...
  324.     move.w    d5,(a6,d1.l*2)
  325.     bra    reci_loop1
  326.  
  327. reci_ready:
  328.     move.l    a1,_bitBuffer(a4)
  329.     move.l     d7,_bitOffset(a4)
  330.  
  331.  
  332. ; this won't work anymore ... reference a3 instead!
  333. ;     addq.l    #1,([_mbCoeffPtr,a4],d1.l*4)    ; ANALYSIS
  334.  
  335.     movem.l    (sp)+,ri_regs
  336.     rts
  337.  
  338.  
  339.  
  340.  
  341.  
  342. ; ***************************************************************
  343.  
  344. bgsh_x:    move.l    a0,-(sp)
  345.     move.l    d0,-(sp)
  346.     move.l    a1,-(sp)
  347.     bsr    @correct_underflow
  348.     move.l    (sp)+,a1
  349.     move.l    (sp)+,d0
  350.     bra.s    bsngsh
  351.  
  352.     XDEF    @s_get_bits_huff
  353. @s_get_bits_huff:
  354.     moveq    #2,d1
  355.     cmp.l    _bufLength(a4),d1
  356.     bgt.s    bgsh_x
  357.  
  358.     XDEF    @sn_get_bits_huff
  359. @sn_get_bits_huff:
  360.     move.l    a0,-(sp)
  361. bsngsh:
  362.  
  363.     move.l    _bitOffset(a4),d1
  364.     move.l    _bitBuffer(a4),a0
  365.     bfextu    (a0){d1:d0},d2
  366.  
  367.     move.l    (sp)+,a0
  368.  
  369.     move.w    (a1,d2.w*2),d0
  370.     bmi.s    gbh_error
  371.  
  372.     moveq    #0,d2
  373.     move.b    d0,d2
  374.  
  375. ;    add.l    d2,_bitCount(a4)    ; ANALYSIS
  376.  
  377.     add.l    d1,d2
  378.     moveq    #32,d1
  379.     cmp.l    d1,d2
  380.     blt.s    bsgdhw
  381.     sub.l    d1,d2
  382.     addq.l    #4,_bitBuffer(a4)
  383.     subq.l    #1,_bufLength(a4)
  384. bsgdhw:
  385.     move.l    d2,_bitOffset(a4)
  386.  
  387.     lsr.w    #8,d0
  388.     moveq    #0,d1
  389.     lsr.w    #1,d0
  390.     addx.w    d1,d1
  391.     move.l    d1,(a0)            ; save intra
  392.     rts
  393.  
  394. gbh_error:
  395.     moveq    #1,d0
  396.     move.l    d0,(a0)
  397.     rts
  398.  
  399.  
  400.  
  401. ; ***************************************************************
  402.  
  403.  
  404.     XDEF    @s_DecodeCBP
  405. @s_DecodeCBP:
  406.     moveq    #9,d0
  407.     lea    _coded_block_pattern,a0
  408.     bra.s    @s_get_byte_huff
  409.  
  410.     XDEF    @sn_DecodeCBP
  411. @sn_DecodeCBP:
  412.     moveq    #9,d0
  413.     lea    _coded_block_pattern,a0
  414.     bra.s    @sn_get_byte_huff
  415.  
  416.  
  417. gsh_x:    move.l    d2,-(sp)
  418.     move.l    a0,-(sp)
  419.     move.l    d0,d2
  420.     bsr    @correct_underflow
  421.     move.l    d2,d0
  422.     move.l    (sp)+,a0
  423.     bra.s    sngsh
  424.  
  425.     XDEF    @s_get_byte_huff
  426. @s_get_byte_huff:
  427.     moveq    #2,d1
  428.     cmp.l    _bufLength(a4),d1
  429.     bgt.s    gsh_x
  430.  
  431.     XDEF    @sn_get_byte_huff
  432. @sn_get_byte_huff:
  433.     move.l    d2,-(sp)
  434. sngsh:
  435.  
  436.     move.l    _bitOffset(a4),d1
  437.     move.l    _bitBuffer(a4),a1
  438.     bfextu    (a1){d1:d0},d2
  439.  
  440.     move.w    (a0,d2.w*2),d0
  441.  
  442.     moveq    #0,d2
  443.     move.b    d0,d2
  444.  
  445. ;    add.l    d2,_bitCount(a4)    ; ANALYSIS
  446.  
  447.     add.l    d1,d2
  448.     moveq    #32,d1
  449.     cmp.l    d1,d2
  450.     blt.s    sgdhw
  451.     sub.l    d1,d2
  452.     addq.l    #4,_bitBuffer(a4)
  453.     subq.l    #1,_bufLength(a4)
  454. sgdhw:
  455.     move.l    d2,_bitOffset(a4)
  456.  
  457.     lsr.w    #8,d0
  458.     extb.l    d0
  459.  
  460.     move.l    (sp)+,d2
  461.     rts
  462.  
  463.  
  464. ; ***************************************************************
  465.  
  466.     XDEF    _s_DecodeDCTCoeff
  467. _s_DecodeDCTCoeff:
  468. dcdregs    REG    d2-d7
  469.     movem.l    dcdregs,-(sp)
  470.  
  471.     move.l    _bitBuffer(a4),a1
  472.     move.l    _bitOffset(a4),d7
  473.     moveq    #32,d6
  474.  
  475.     process_intra    endofblock,a2
  476.  
  477.     move.l    a1,_bitBuffer(a4)
  478.     move.l     d7,_bitOffset(a4)
  479.  
  480.     move.l    d5,(a0)        ; int *level
  481.  
  482.  
  483. endofblock:
  484.     move.w    d3,d0        ; run = return value!
  485.     ext.l    d0
  486.  
  487.     movem.l    (sp)+,dcdregs
  488.     rts
  489.  
  490.  
  491.  
  492. ; ***************************************************************
  493.  
  494.     XDEF    @s_DecodeDCTDCSizeLum
  495. @s_DecodeDCTDCSizeLum:
  496.     moveq    #7,d1
  497.     lea    _dct_dc_size_luminance,a1
  498.     bra.s    sdlc
  499.  
  500.     XDEF    @s_DecodeDCTDCSizeChrom
  501. @s_DecodeDCTDCSizeChrom:
  502.     moveq    #8,d1
  503.     lea    _dct_dc_size_chrominance,a1
  504. sdlc:    move.l    d2,-(sp)
  505.     move.l    d3,-(sp)
  506.  
  507.     move.l    _bitOffset(a4),d0
  508.     move.l    _bitBuffer(a4),a0
  509.     moveq    #16,d3
  510.     bfextu    (a0){d0:d3},d2
  511.  
  512.     move.l    d2,d0
  513.     sub.l    d1,d3
  514.     lsr.l    d3,d0
  515.     move.w    (a1,d0.w*2),d0        ; macroval
  516.  
  517.     move.b    d0,d3            ; flushed.l
  518.     lsl.w    d3,d2
  519.     lsr.w    d3,d2            ; mask off the header
  520.  
  521.     lsr.w    #8,d0            ; size
  522.     tst.w    d0            ; necessary ?
  523.     beq.s    cdlflush
  524.  
  525.     add.w    d0,d3
  526.     moveq    #16,d1
  527.     sub.l    d3,d1
  528.     lsr.l    d1,d2            ; trash unused lower bits
  529.  
  530.     subq.l    #1,d0            ; MPEG has some really strange sign extension, just like JPEG! Weirdo!
  531.     btst    d0,d2
  532.     bne    cdlsign
  533.     moveq    #-2,d1
  534.     lsl.l    d0,d1
  535.     or.l    d1,d2
  536.     addq.l    #1,d2
  537. cdlsign: move.l    d2,d0            ; the desired result
  538. cdlflush:
  539.  
  540. ;    add.l    d3,_bitCount(a4)    ; ANALYSIS
  541.  
  542.     add.l    _bitOffset(a4),d3
  543.     moveq    #32,d1
  544.     cmp.l    d1,d3
  545.     blt.s    cdlXw
  546.     sub.l    d1,d3
  547.     addq.l    #4,_bitBuffer(a4)
  548.     subq.l    #1,_bufLength(a4)
  549. cdlXw:
  550.     move.l    d3,_bitOffset(a4)
  551.     move.l    (sp)+,d3
  552.     move.l    (sp)+,d2
  553.     rts
  554.  
  555.  
  556. ; ***************************************************************
  557.  
  558. sgb1:    bsr    @correct_underflow
  559.     bra.s    @sn_get_bits1
  560.  
  561.     XDEF    @s_get_bits1
  562. @s_get_bits1:
  563.     moveq    #2,d1
  564.     cmp.l    _bufLength(a4),d1
  565.     bgt.s    sgb1
  566.  
  567.     XDEF    @sn_get_bits1
  568. @sn_get_bits1:
  569. ;    addq.l    #1,_bitCount(a4)    ; ANALYSIS
  570.     move.l    _bitBuffer(a4),a0
  571.     move.l    _bitOffset(a4),d1
  572.     moveq    #1,d0            ; hmm ?!
  573.     bfextu    (a0){d1:d0},d0
  574.     addq.l    #1,d1
  575.     btst    #5,d1
  576.     beq.s    gb1r
  577.     addq.l    #4,a0
  578.     moveq    #0,d1
  579.     move.l    a0,_bitBuffer(a4)
  580.     subq.l    #1,_bufLength(a4)
  581. gb1r:    move.l    d1,_bitOffset(A4)
  582.     rts
  583.  
  584.  
  585.  
  586. sgbX:    move.l    d0,-(sp)
  587.     bsr    @correct_underflow
  588.     move.l    (sp)+,d0
  589.     bra.s    @sn_get_bitsX
  590.  
  591.     XDEF    @s_get_bitsX
  592. @s_get_bitsX:
  593.     moveq    #2,d1
  594.     cmp.l    _bufLength(a4),d1
  595.     bgt.s    sgbX
  596.  
  597.     XDEF    @sn_get_bitsX
  598. @sn_get_bitsX:
  599. ;    add.l    d0,_bitCount(a4)    ; ANALYSIS
  600.     move.l    _bitOffset(a4),d1
  601.     move.l    _bitBuffer(a4),a0
  602.     move.l    d1,a1
  603.     add.l    d0,a1
  604.     bfextu    (a0){d1:d0},d0
  605.     moveq    #32,d1
  606.     cmp.l    d1,a1
  607.     blt.s    gsbXw
  608.     sub.l    d1,a1
  609.     addq.l    #4,a0
  610.     move.l    a0,_bitBuffer(a4)
  611.     subq.l    #1,_bufLength(a4)
  612. gsbXw:    move.l    a1,_bitOffset(a4)
  613.     rts
  614.  
  615.  
  616. ; ***************************************************************
  617.  
  618. ssb32_ofoi:
  619.     bsr    @correct_underflow        ; ofoi OPT
  620.     bra.s    @sn_show_bits32
  621.  
  622.     XDEF    @s_show_bits32
  623. @s_show_bits32
  624.     moveq    #2,d1
  625.     cmp.l    _bufLength(a4),d1
  626.     bgt.s    ssb32_ofoi
  627.  
  628.     XDEF    @sn_show_bits32
  629. @sn_show_bits32:
  630.     move.l    _bitBuffer(a4),a0
  631.     move.l    _bitOffset(a4),d1
  632.     moveq    #32,d0
  633.     bfextu    (a0){d1:d0},d0
  634.     rts
  635.  
  636.  
  637. ssb_x:    move.l    d0,-(sp)
  638.     bsr    @correct_underflow
  639.     move.l    (sp)+,d0
  640.     bra.s    @sn_show_bitsX
  641.  
  642.     XDEF    @s_show_bitsX
  643. @s_show_bitsX
  644.     moveq    #2,d1
  645.     cmp.l    _bufLength(a4),d1
  646.     bgt.s    ssb_x
  647.  
  648.     XDEF    @sn_show_bitsX
  649. @sn_show_bitsX:
  650.     move.l    _bitOffset(a4),d1
  651.     move.l    _bitBuffer(a4),a0
  652.     bfextu    (a0){d1:d0},d0
  653.     rts
  654.  
  655.  
  656.  
  657. ; ***************************************************************
  658.  
  659.  
  660. sf32_ofoi:
  661.     bsr    @correct_underflow    ; moved away
  662.     bra.s    @sn_flush_bits32
  663.  
  664.     XDEF @s_flush_bits32
  665. @s_flush_bits32:
  666.     moveq    #2,d1
  667.     cmp.l    _bufLength(a4),d1
  668.     bgt.s    sf32_ofoi
  669.  
  670.     XDEF @sn_flush_bits32
  671. @sn_flush_bits32:
  672. ;    add.l    #32,_bitCount(a4)    ; ANALYSIS
  673.     addq.l    #4,_bitBuffer(a4)
  674.     subq.l    #1,_bufLength(a4)
  675.     rts
  676.  
  677.  
  678. sf_outtafoi:
  679.     move.l    d0,-(sp)
  680.     bsr    @correct_underflow    ; moved away, out of flow of instructions
  681.     move.l    (sp)+,d0
  682.     bra.s    @sn_flush_bits
  683.  
  684.     XDEF @s_flush_bits
  685. @s_flush_bits:
  686.     moveq    #2,d1
  687.     cmp.l    _bufLength(a4),d1
  688.     bgt.s    sf_outtafoi
  689.  
  690.     XDEF @sn_flush_bits
  691. @sn_flush_bits:
  692. ;    add.l    d0,_bitCount(a4)    ; ANALYSIS
  693.     add.l    _bitOffset(a4),d0
  694.     moveq    #32,d1
  695.     cmp.l    d1,d0
  696.     blt.s    sbf32
  697.     sub.l    d1,d0
  698.     addq.l    #4,_bitBuffer(a4)
  699.     subq.l    #1,_bufLength(a4)
  700. sbf32:    move.l     d0,_bitOffset(a4)
  701.     rts
  702.  
  703.  
  704.  
  705. locallevel:    ds.l    1
  706.  
  707. ; ***************************************************************
  708. ;
  709.  
  710.     SECTION    data,DATA
  711.  
  712.  
  713. ;
  714. ; Decoding table for coded_block_pattern
  715. ;
  716.  
  717. ;    XDEF    _coded_block_pattern
  718.  
  719. _coded_block_pattern:
  720.     dc.b    ER, 0, ER, 0, 39, 9, 27, 9, 59, 9, 55, 9, 47, 9, 31, 9
  721.     dc.b    58, 8, 58, 8, 54, 8, 54, 8, 46, 8, 46, 8, 30, 8, 30, 8
  722.     dc.b    57, 8, 57, 8, 53, 8, 53, 8, 45, 8, 45, 8, 29, 8, 29, 8
  723.     dc.b    38, 8, 38, 8, 26, 8, 26, 8, 37, 8, 37, 8, 25, 8, 25, 8
  724.     dc.b    43, 8, 43, 8, 23, 8, 23, 8, 51, 8, 51, 8, 15, 8, 15, 8
  725.     dc.b    42, 8, 42, 8, 22, 8, 22, 8, 50, 8, 50, 8, 14, 8, 14, 8
  726.     dc.b    41, 8, 41, 8, 21, 8, 21, 8, 49, 8, 49, 8, 13, 8, 13, 8
  727.     dc.b    35, 8, 35, 8, 19, 8, 19, 8, 11, 8, 11, 8,  7, 8,  7, 8
  728.     dc.b    34, 7, 34, 7, 34, 7, 34, 7, 18, 7, 18, 7, 18, 7, 18, 7
  729.     dc.b    10, 7, 10, 7, 10, 7, 10, 7,  6, 7,  6, 7,  6, 7,  6, 7
  730.     dc.b    33, 7, 33, 7, 33, 7, 33, 7, 17, 7, 17, 7, 17, 7, 17, 7
  731.     dc.b     9, 7,  9, 7,  9, 7,  9, 7,  5, 7,  5, 7,  5, 7,  5, 7
  732.     dc.b    63, 6, 63, 6, 63, 6, 63, 6, 63, 6, 63, 6, 63, 6, 63, 6
  733.     dc.b     3, 6,  3, 6,  3, 6,  3, 6,  3, 6,  3, 6,  3, 6,  3, 6
  734.     dc.b    36, 6, 36, 6, 36, 6, 36, 6, 36, 6, 36, 6, 36, 6, 36, 6 
  735.     dc.b    24, 6, 24, 6, 24, 6, 24, 6, 24, 6, 24, 6, 24, 6, 24, 6 
  736.     dc.b    62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5
  737.     dc.b    62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5
  738.     dc.b     2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5
  739.     dc.b     2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5 
  740.     dc.b    61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5
  741.     dc.b    61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5 
  742.     dc.b     1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5
  743.     dc.b     1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5 
  744.     dc.b    56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5
  745.     dc.b    56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5 
  746.     dc.b    52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5 
  747.     dc.b    52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5 
  748.     dc.b    44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5 
  749.     dc.b    44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5 
  750.     dc.b    28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5 
  751.     dc.b    28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5 
  752.     dc.b    40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5 
  753.     dc.b    40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5 
  754.     dc.b    20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5 
  755.     dc.b    20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5 
  756.     dc.b    48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5 
  757.     dc.b    48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5 
  758.     dc.b    12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5 
  759.     dc.b    12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5 
  760.     dc.b    32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
  761.     dc.b    32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
  762.     dc.b    32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
  763.     dc.b    32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
  764.     dc.b    16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
  765.     dc.b    16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
  766.     dc.b    16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
  767.     dc.b    16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
  768.     dc.b     8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4 
  769.     dc.b     8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4 
  770.     dc.b     8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4 
  771.     dc.b     8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4
  772.     dc.b     4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4
  773.     dc.b     4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4 
  774.     dc.b     4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4 
  775.     dc.b     4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4
  776.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
  777.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
  778.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
  779.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
  780.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
  781.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
  782.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
  783.     dc.b    60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3
  784.  
  785.  
  786.  
  787.  
  788. ;    XDEF    _dct_dc_size_luminance
  789. ;    XDEF    _dct_dc_size_chrominance
  790.  
  791. _dct_dc_size_luminance:
  792.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
  793.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
  794.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
  795.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
  796.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  797.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  798.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  799.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  800.     dc.b    0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3
  801.     dc.b    0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3
  802.     dc.b    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
  803.     dc.b    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
  804.     dc.b    4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3
  805.     dc.b    4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3
  806.     dc.b    5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4
  807.     dc.b    6, 5, 6, 5, 6, 5, 6, 5, 7, 6, 7, 6, 8, 7, ER,0
  808.  
  809.  
  810. _dct_dc_size_chrominance:
  811.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  812.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  813.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  814.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  815.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  816.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  817.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  818.     dc.b    0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
  819.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  820.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  821.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  822.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  823.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  824.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  825.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  826.     dc.b    1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
  827.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  828.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  829.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  830.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  831.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  832.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  833.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  834.     dc.b    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
  835.     dc.b    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
  836.     dc.b    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
  837.     dc.b    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
  838.     dc.b    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
  839.     dc.b    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 
  840.     dc.b    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 
  841.     dc.b    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 
  842.     dc.b    6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, ER,0
  843.  
  844.  
  845. ; ***************************************************************
  846.  
  847.     END
  848.